function public() {
    // 获取非行间样式
    function getStyle(elem, attr) {
        // elem: 元素
        // attr: 属性
        if (window.getComputedStyle) {
            // 标准
            // console.log(window.getComputedStyle(elem)[attr]);
            return window.getComputedStyle(elem)[attr];
        } else {
            // ie
            // console.log(elem.currentStyle[attr]);
            return elem.currentStyle[attr];
        }
    }

    // 运动函数
    var timerId = null;

    function move(elem, attr, speed, target) {
        // elem: 元素
        // attr: 属性
        // speed: 每一步的步长
        // target: 目标结果值
        // 3.7 开始新的定时器之前清除旧的定时器  
        clearInterval(timerId);
        // 什么时候speed是正数 什么时候speed是负数
        var qs = parseInt(getStyle(elem, attr));
        speed = qs < target ? speed : -speed;

        // 3.1 定时器
        timerId = setInterval(function () {
            // 3.2 获取当前位置  1px --> 1  100px-->100
            var cur = parseInt(getStyle(elem, attr));
            // 3.3 向前移动10px
            var end = cur + speed; // + 10 + +10  -10  + -10
            // 3.5 判断是否到达结束值  1000
            if ((end <= target && speed < 0) || (end >= target && speed > 0)) {
                end = target;
                // 3.6 清除定时器
                clearInterval(timerId);
            }
            // 3.4 改变elem的left 元素.style.属性名 = 值
            elem.style[attr] = end + 'px';
        }, 10);
    }

    // 获取随机数
    function getRandom(min, max) {
        var num = Math.floor(Math.random() * (max - min) + min);
        return num;
    }

    // 添加0
    function add0(num) { // num = 5
        num = num >= 10 ? num : '0' + num; // num = 5 >= 10? num : 0+ num;  num = 05
        return num;
    }

    // 获取随机验证码
    function getRandomCode(n, str) { // 可传可不传的参数 就叫做可选参数 
        // 可选设置默认值
        n = n ? n : 4;
        str = str ? str : '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        // 4. 存储字符串
        var nstr = '';
        // 2. 需要生成4位字符  随机 ---> 下标 ---> 4个
        for (var i = 0; i < n; i++) {
            // 3. 随机数 整个字符串的长度
            var num = Math.floor(Math.random() * str.length);
            console.log(num);
            // 5. 拼接
            nstr += str[num];
        }
        return nstr;
    }

    // 用来创建标签
    function cE(elem, val) {
        // elem: 标签名
        // val: 标签的内容
        var td2 = document.createElement(elem);
        td2.innerHTML = val;

        // 函数内的td2  要在外面使用  将td2 作为返回值 返回出去
        return td2;
    }

    // 事件绑定函数
    function bind(elem, type, fn) {
        // elem: 元素
        // type: 事件类型
        // fn: 函数
        // 判断
        if (elem.addEventListener) {
            elem.addEventListener(type, fn, false);
        } else {
            // ie
            elem.attachEvent('on' + type, fn);
        }
    }

    // 事件解绑函数
    function unbind(elem, type, fn) {
        // elem: 元素
        // type: 事件类型
        // fn: 函数
        if (elem.removeEventListener) {
            // 标准
            elem.removeEventListener(type, fn, false);
        } else {
            // ie
            elem.detachEvent('on' + type, fn);
        }
    }

    // 元素滚动滚轮事件
    function mScroll(elem, upfn, downfn) {
        // elem: 元素
        // upfn: 页面向上走的时候触发的函数
        // downfn: 页面向下走的时候触发的函数
        elem.onmousewheel = scroll;
        if (elem.addEventListener) {
            elem.addEventListener('DOMMouseScroll', scroll);
        }

        function scroll(evs) {
            // console.log('滚了');
            var ev = window.event || evs;

            // 1. 不知道什么状态 假设
            var tag = true; // true--上  false--下

            // 3. 判断当前是什么浏览器
            if (ev.wheelDelta) {
                // chrome / ie
                tag = ev.wheelDelta > 0 ? false : true;
            } else {
                // ff 
                tag = ev.detail > 0 ? true : false;
            }

            // 2. 根据tag判断向上向下
            if (tag) {
                // 具体向上
                upfn();
            } else {
                // 具体向下
                downfn();
            }
        }
    }

    // 拖拽函数  碰撞检测
    function drag(elem, big) { // elem: 元素
        // 1. 鼠标按下事件
        elem.onmousedown = function (evs) {
            // 2. 兼容
            var ev = window.event || evs;
            // 3. 按下的时候 鼠标距离元素左侧的距离x: 鼠标的位置 ev.clientX - 盒子的偏移位置 offsetLeft
            var x = ev.clientX - elem.offsetLeft;
            var y = ev.clientY - elem.offsetTop;

            // 4. 加上移动
            document.onmousemove = function (evs) {
                // 5. 兼容
                var ev = window.event || evs;
                // 6. 求left = clientX - x
                var l = ev.clientX - x;
                var t = ev.clientY - y;

                // 7. 赋值给elem
                elem.style.left = l + 'px';
                elem.style.top = t + 'px';

                if (big) {
                    if ((l < big.offsetLeft - elem.offsetWidth) || (l > big.offsetLeft + big.offsetWidth) || (t < big.offsetTop - elem.offsetHeight) || (t > big.offsetTop + big.offsetHeight)) {
                        p.style.background = "#ccc";
                    } else {
                        p.style.background = "pink";
                    }
                }
            }


            // 8. 当鼠标抬起的时候 移动事件清除
            document.onmouseup = function () {
                document.onmousemove = null;
                // 11. 释放捕获
                if (elem.releaseCapture) {
                    elem.releaseCapture();
                }
            }

            // 9. 阻止默认行为
            // 10. 设置全局捕获: 元素.setCapture();
            if (elem.setCapture) {
                elem.setCapture();
            }
            return false;
        }
    }


    // 缓冲运动
    function buffMove(elem, json, fn) {
        // elem: 元素
        // json: 每一个属性名和属性值
        // fn: 回调函数 非必传

        // 8.频繁触发的时候 清除定时器
        clearInterval(elem.timer);
        // 开启定时器
        elem.timer = setInterval(function () {
            // 12. 假设本次已经到达
            var tag = true; // true--已经到达  false--未到达
            // 所有的属性 
            for (var key in json) {
                // key: 属性名-->attr
                // json[key]: 属性值--->target

                // 4. 获取当前位置
                // 11. 判断是不是透明度属性
                if (key == 'opacity') {
                    var cur = getStyle(elem, key) * 100;
                } else {
                    var cur = parseInt(getStyle(elem, key));
                }

                // 10. 计算速度
                var speed = (json[key] - cur) / 10;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                // 5. 计算结束位置
                var end = cur + speed;

                // 7. 添加判断
                // 判断哪一个没有到达目标值
                if (end != json[key]) {
                    // 13 假设不成立
                    tag = false;
                }


                // 6. 赋值给elem的key
                // 12 判断是否是透明度属性
                if (key == 'opacity') {
                    elem.style[key] = end / 100;
                } else {
                    elem.style[key] = end + 'px';
                }
            }
            // for执行结束之后 tag还是true  表示所有属性都到达了目标值  可以清除定时器
            if (tag) {
                clearInterval(elem.timer);
                // 如果fn存在 调用fn
                fn && fn();
            }
        }, 10);
    }





    // 阶乘
    function jc(n) {
        if (n == 1) {
            return 1;
        };
        return n * jc(n - 1);
    }

    // 斐波那契数列
    function fib(n) {
        if (n <= 2) {
            return 1;
        }
        return fib(n - 1) + fib(n - 2);
    }

    // 快速排序
    function qs(array) { // 用来接收要排序的数组
        // 8. 设置结束条件: 当数组的长度小于等于1
        if (array.length <= 1) {
            return array;
        }

        // 2. 找到数组中间下标
        var num = Math.floor(array.length / 2);

        // 3. 找到中间下标对应的值 存储到一个变量上
        var val = array[num];

        // 4. 在原数组中 删除掉上一步的中间的项
        array.splice(num, 1);

        // 5. 声明两个数组 分别用来存储比中间项大的或者小的值
        var left = [],
            right = [];

        // 6. 遍历原数组 将比中间项小的放在左边 大的放在右边
        for (var i = 0; i < array.length; i++) {
            if (array[i] < val) {
                left.push(array[i]);
            } else {
                right.push(array[i]);
            }
        }
        // 7. 将排序的左、中、右拼接
        return qs(left).concat(val, qs(right));
    }

    // 防抖函数 debounce
    // 时间不确定: time
    // 回调函数: fn  callback 
    function debounce(time, fn) {
        // 记录定时器的唯一标识
        var timer = null;

        function de() {
            // 清除定时器
            clearTimeout(timer);
            // 开启定时器 1000
            timer = setTimeout(function () {
                // 具体的操作
                fn();
            }, time);
        }
        return de;
    }

    // 节流: throttle
    function throttle(time, fn) {
        // 假设当前事件可以触发
        var flag = true; // true---事件可以触发  false---> 不能再触发

        function th() {
            // 判断当前事件是否可以被执行 flag为ture
            if (flag) {
                // 代码可以执行
                setTimeout(function () {
                    // 具体的代码
                    fn();
                    //  触发状态更新 从不可以变成可
                    flag = true;
                }, time);
                // 触发状态更新 从可以变成不可以
                flag = false;
            }
        }
        // 返回值
        return th;
    }


    //寄生式组合继承的函数
    function inherit(Parent, Child) {
        // 寄生式组合继承  虚构一个父类构造函数
        var F = function () {};
        F.prototype = Parent.prototype;
        // 原型链继承: 子类构造函数的原型对象 = 父类构造函数的实例化对象
        Child.prototype = new F();
        // 设置上constructor属性
        Child.prototype.constructor = Child;
    }

    // 作为数组返回出去
    return {
        'inherit': inherit,
        'jc': jc,
        'throttle': throttle,
        'qs': qs,
        'fib': fib,
        'drag': drag,
        'mScroll': mScroll,
        'unbind': unbind,
        'bind': bind,
        'cE': cE,
        'getRandomCode': getRandomCode,
        'add0': add0,
        'getRandom': getRandom,
        'move': move,
        'getStyle': getStyle,
        'buffMove': buffMove,
        'debounce': debounce
    }
}

var pbc = public();

//搜索框跳转
$('#search').on('click', () => {
    window.location.href = './search_list.html?keyword=' + ($('#search_input').val())
})


//登录页面js 
var loginBtn = document.getElementById('loginBtn');
var registerBtn = document.getElementById('registerBtn');

var layer = document.getElementById('layer');
var register = document.getElementById('register');
var login = document.getElementById('login');

//阻止登录注册默认样式
$('#loginbtn').on('click', async function (ev) {
    ev.preventDefault();
    let data = {
        tel: $('#logTel').val(),
        pas: $('#logPas').val()
    }
    let result = await sendAjax({
        url: '/v1/member/login',
        type: 'post',
        data
    });
    console.log(result);
    if (result.code == 200) {
        alert(result.msg);
        //将token存储在localStorage中
        window.localStorage.setItem('token', result.data.token);
        window.localStorage.setItem('photo', result.data.photo);
        window.localStorage.setItem('username', result.data.username);
        login.style.display = 'none';
        layer.style.display = 'none';
        lrs[0].style.display = 'none';
        lrs[1].style.display = 'block';
        lrsUlLis[0].innerHTML = result.data.username;
        $('.lr:eq(1) img:eq(0)').attr('src', result.data.photo);
        history.go(0);
    } else {
        alert('账号或者密码错误，请重新输入')
    }
})







//点击页面上的登录注册按钮分别进入登录注册
loginBtn.onclick = function () {
    layer.style.display = 'block';
    login.style.display = 'block';
}
registerBtn.onclick = function () {
    layer.style.display = 'block';
    register.style.display = 'block';
}


var telReg = /^1[3-9]\d{9}$/;
var pasReg = /(?!^[a-zA-Z]+$|^[0-9]+$)^[a-zA-Z0-9]{5,10}$/;

var loginErr = login.getElementsByClassName('err')[0];

var loginClose = login.getElementsByClassName('close')[0];
var registerClose = register.getElementsByClassName('close')[0];
var loginRegi = login.getElementsByClassName('regi')[0];
var registerLog = register.getElementsByClassName('log')[0];
loginClose.onclick = function () {
    layer.style.display = 'none';
    login.style.display = 'none';
}
registerClose.onclick = function () {
    layer.style.display = 'none';
    register.style.display = 'none';
}
loginRegi.onclick = function () {
    login.style.display = 'none';
    register.style.display = 'block';
}
registerLog.onclick = function () {
    register.style.display = 'none';
    login.style.display = 'block';
}


//手机号框判断
login.tel.onblur = function () {
    if (!telReg.test(login.tel.value)) {
        login.tel.style.borderColor = 'red';
        loginErr.style.visibility = 'visible';
    } else {
        login.tel.style.borderColor = '#80c4ae';
        loginErr.style.visibility = 'hidden';
    }
};
//密码框判断
login.pas.onblur = function () {
    if (!pasReg.test(login.pas.value)) {
        login.pas.style.borderColor = 'red';
        loginErr.style.visibility = 'visible';
    } else {
        login.pas.style.borderColor = '#80c4ae';
        loginErr.style.visibility = 'hidden';
    }
}


var registerErrs = register.getElementsByClassName('err');
//注册页面js判断手机号与密码
register.tel.onblur = async function () {
    if (!telReg.test(register.tel.value)) {
        register.tel.style.borderColor = 'red';
        registerErrs[0].style.visibility = 'visible';
    } else {
        register.tel.style.borderColor = '#80c4ae';
        registerErrs[0].style.visibility = 'hidden';
    }
    let tel = register.tel.value;
    let result = await sendAjax({
        url: '/v1/member/isExist',
        data: {
            tel
        },
        type: 'post'
    });
    console.log(result);
    if (result.code == 208) {
        alert(result.msg);
        register.tel.value ='';
       
    }


}
register.pas.onblur = function () {
    if (!pasReg.test(register.pas.value)) {
        register.pas.style.borderColor = 'red';
        registerErrs[1].style.visibility = 'visible';

    } else {
        register.pas.style.borderColor = '#80c4ae';
        registerErrs[1].style.visibility = 'hidden';

    }
}
register.pas1.onblur = function () {
    if (register.pas1.value != register.pas.value) {
        register.pas1.style.borderColor = 'red';
        registerErrs[2].style.visibility = 'visible';
    } else {
        register.pas1.style.borderColor = '#80c4ae';
        registerErrs[2].style.visibility = 'hidden';
    }
}
register.yz.onblur = function () {
    if (register.yz.value != 5739) {
        register.yz.style.borderColor = 'red';
        registerErrs[3].style.visibility = 'visible';
    } else {
        register.yz.style.borderColor = '#80c4ae';
        registerErrs[3].style.visibility = 'hidden';
    }
}

//点击注册按钮
$('#regi').on('click', async (ev) => {
    ev.preventDefault();
    if (telReg.test(register.tel.value) && pasReg.test(register.pas.value) && register.pas1.value == register.pas.value && register.yz.value == 5739 && register.check.checked) {
        let data = {
            tel: $('#regTel').val(),
            pas: $('#regPas').val()
        }
        let result = await sendAjax({
            url: '/v1/member/register',
            type: 'post',
            data
        });
        if (result.code == 200) {
            alert(result.msg);
            register.style.display = 'none';
            login.style.display = 'block';
        } else {
            alert(result.msg);
        }
    } else {
        alert('请输入必填信息');
    }

})


var header = document.getElementById('header');
var lrs = header.getElementsByClassName('lr');

//判断是否存在mid
let mid = getMid();
if (mid) {
    lrs[0].style.display = 'none';
    lrs[1].style.display = 'block';
    let username = window.localStorage.getItem('username');
    let photo = window.localStorage.getItem('photo');
    $('.lr:eq(1) img:eq(0)').attr('src', photo);
    $('.lr:eq(1) ul:eq(0) li:eq(0)').html(username)
} else {
    lrs[0].style.display = 'block';
    lrs[1].style.display = 'none';
}

//点击头像显示出来个人中心
var lrsUl = lrs[1].getElementsByTagName('ul')[0];

var lrsTag = 0;

lrs[1].onclick = function () {
    if (lrsTag == 0) {
        lrsUl.style.display = 'block';
        lrsTag = 1;
    } else {
        lrsUl.style.display = 'none';
        lrsTag = 0;
    }
}

//退出按钮  退出登录并且回到按钮退出登录的状态

var lrsUlLis = lrsUl.getElementsByTagName('li');
lrsUlLis[5].onclick = function () {
    window.localStorage.setItem('token', '');
    window.localStorage.setItem('photo', '');
    window.localStorage.setItem('id', '');
    history.go(0);
}


//返回顶部按钮
var returnTop = document.getElementById('return_top');
var returnTopImgs = returnTop.getElementsByTagName('img');


returnTopImgs[2].onclick = function () {
    document.documentElement.scrollTop = 0;
}
window.onscroll = function () {
    if (document.documentElement.scrollTop >= 430) {
        returnTop.style.display = 'block';
    } else {
        returnTop.style.display = 'none';
    }
}